package mhl.service;

import mhl.dao.BillDAO;
import mhl.dao.MultiTableDAO;
import mhl.domain.Bill;
import mhl.domain.MultiTableBean;

import java.util.List;
import java.util.UUID;

/**
 * 该类处理和账单相关的业务逻辑(通过调用BillDAO对象完成)
 */
public class BillService {

    //定义一个 BillDAO 属性
    private BillDAO billDAO = new BillDAO();
    //定义一个 MenuService 属性
    private MenuService menuService = new MenuService();
    //定义一个 DiningTableService 属性
    private DiningTableService diningTableService = new DiningTableService();
    //定义一个 MultiTableDAO 属性
    private MultiTableDAO multiTableDAO = new MultiTableDAO();

    //编写点餐的方法
    //1.生成菜单
    //2.更新对应餐桌的状态
    //3.如果成功返回 true，否则返回 false
    public boolean orderMenu(int menuId, int nums, int diningTableId) {

        //生成一个账单编号，UUID.randomUUID().toString()返回一个全局唯一标识符 字符串
        String billId = UUID.randomUUID().toString();

        //将账单生成到 bill 表
        int update = billDAO.update("insert into bill values(null,?,?,?,?,?,now(),'未结账')",
                billId, menuId, nums,
                menuService.getMenuById(menuId).getPrice() * nums, diningTableId);
        if (update <= 0) {
            return false;
        }

        //更新对应的餐桌状态
        return diningTableService.updateDiningTableState(diningTableId, "就餐中");

    }

    //返回所有的账单
    public List<Bill> getBills() {
        return billDAO.queryMulti("select * from bill", Bill.class);
    }
    //返回所有的账单并包含菜品名
    public List<MultiTableBean> getBills2() {
        return multiTableDAO.queryMulti("SELECT bill.*,NAME,price " +
                "FROM bill,menu " +
                "WHERE bill.menuId=menu.id", MultiTableBean.class);
    }

    //查看某个餐桌是否有未结账的账单
    public boolean hasPayBillByDiningTableId(int diningTableId) {
        Bill bill = billDAO.querySingle
                ("SELECT * FROM bill WHERE diningTableId=? AND state='未结账' LIMIT 0,1",
                        Bill.class, diningTableId);
        return bill != null;
    }

    //完成结账[如果餐桌存在，并且该餐桌有未结账的账单]
    //如果成功，返回true, 失败返回 false
    public boolean payBill(int diningTableId, String payMode) {//payMode结账方式

        //如果这里使用事务的话，需要用ThreadLocal来解决 , 框架中比如mybatis 提供了事务支持
        //1. 修改bill表
        int update = billDAO.update
                ("update bill set state=? where diningTableId=? and state='未结账'",
                        payMode, diningTableId);
        if (update <=0){
            return false;
        }

        //2. 修改diningTable表
        //注意：不要直接在这里操作，而应该调用DiningTableService 方法,完成更新，各司其职
        if (!diningTableService.updateDiningTableToFree(diningTableId,"空")){
            return false;
        }
        return true;


    }
}
